סינגלטון טוב ?
private static $instance = null;
public function __construct($dsn, $username, $password, $driver_options = array()) {
if (self::$instance === null ) // check instance ;
{
$options = array_merge($this->bulidin_options,$driver_options); // mix the arrays;
self::$instance = parent::__construct($dsn, $username, $password, $options); // define $instance;
$this->connected = true; // define $connected;
}
return self::$instance; // return the instance;
}
}
אל תתייחסו לכל הקוד , אני הראיתי רק את הקטעים שעוסקים בסינגלטון.
6 תשובות
הבעיה היא שב-PHP אי אפשר להחזיר משהו בקונדסטרקטור:
PHP תמיד תיצוא מופע חדש ותחזיר אותו, לא משנה איזה קוד תוסיף אתה בנוסף לתהליך הזה בתוך הפונקציה construct
זה בלתי אפשרי לעשות ככה.
constructors לא מחזירים ערך. וגם אם תעשה return אז זה פשוט יפסיק את פעולת ה-constructor אבל הערך שתחזיר יהיה חסר כל משמעות.
בנוגע למשתנה static, זו לא בעיה לתקן את זה. הדבר הכי קרוב שאתה יכול לעשות הוא זה:
http://phpguide.co.il/phplive?code=667
במקרה הזה, אין לך פעולה סטטית שמחזירה את האובייקט היחידי של המחלקה. לכן כדי להשתמש באותו אובייקט תהיה תמיד חייב להיות בעל גישה אל ההפנייה אל אותו אובייקט (המשתנה ש"מחזיק" את האובייקט).
ככה שהבעיה בקוד שלך היא לא המשתנה instance, ובטח שאתה לא צריך להשתמש ב-globals. הבעיה היא שהערכים שה-constructor מחזיר הם חסרי ערך ואף אחד לא מתייחס אליהם.
תודה רבה לכם :)
לא הבנתי בקוד שלך את השורה הזאת :
וסיימתי את המחלקה שלי(אם אפשר לקרוא לזה מחלקה חח הכנסתי בתוכה את הדברים הבסיסיים ביותר..): http://pastebin.com/46jJ7C9D אשמח אם תוכלו לתת לי ביקורת ומה צריך לתקן .. :)
זה הקוד המתוקן :
http://pastebin.com/8M3c8Bq5
* ה-constructor שלך חייב להיות private כדי שלא יוכלו ליצור עצמים מהמחלקה שלך מבחוץ.
(self::$instance instanceof $this)
בודק האם המשתנה instance הוא עצם מהסוג של המחלקה הנוכחית.
בחפש בגוגל instanceof php (לא חייב php זה בכל השפות בעל אותה המשמעות).